【完美解决】OpenCVError: Insufficient memory (Failed to allocate xxx bytes) 报错的辛酸踩坑史

您所在的位置:网站首页 cv2error opencv 455 【完美解决】OpenCVError: Insufficient memory (Failed to allocate xxx bytes) 报错的辛酸踩坑史

【完美解决】OpenCVError: Insufficient memory (Failed to allocate xxx bytes) 报错的辛酸踩坑史

2023-08-14 01:59| 来源: 网络整理| 查看: 265

        本人自制的图像处理软件在测试时发现图像太大时(超过3840*2160像素)大概率会因内存分配不足而直接崩掉,一翻操作查阅得知是x86架构可分配的内存太小了,应该升级到x64。以下是作者开发工具的版本

Qt版本:5.11.3

openCV版本:4.1.0

编译器:mingw 5.3.0 32bit

【x64和x86】

windows x64和x32,都是用来形容操作系统的,所以我们在下载操作系统的时候,会存在winx64和x86位系统的选择。

  而不同位数的操作系统,对CPU的运算方式产生的影响或者要求亦不同,所以从更深层次的角度来说,windows64和32位是指CPU运算方式的差异。

  windows x64和x86最主要的区别:

  很多人之所以关注windows x64和x86的差异,是因为32位系统最多只能发挥4G内存的效用,如果电脑安装了大于4G的内存,32位的操作系统是不能更好的利用大于4G的那部分内存的效用的,所以会造成资源浪费。

  而64位的操作系统,按照微软对系统的设定,家庭版本的win7可以最多支持16G的内存,而专业版和旗舰版的win7最多支持的内存容量可达192G内存。

要升级为x64架构首先openCV的库必须是x64的并且编译器也是64位,如果没有已经编译好的可用x64版本的OpenCV库就自己手动编译一个,本文主要针对Qt creator的64位环境搭建

【下载64位的mingw】         这里存在第一个坑就是下载的mingw就算是64位的,如果不支持posix的话可以编译Qt源码但是编译openCV依然会报错,并且调用编译好的openCV库也会报错,例如:'Mutex' is not a member of 'cv' ,如果电脑已经安装mingw并且已经配置好环境变量可以打开cmd输入 gcc -v查看当前编译器版本

 如果enable-threads = win32或其他说明不可用,可以下载作者的版本【踩坑无数亲测有效】

百度云链接:https://pan.baidu.com/s/1GpWMZ8owLBYgbGobDINxYg  提取码:tb5i

解压在一个没有中文和空格的路径(笔者解压到了Qt的目录下),配置好环境变量,如果环境变量下有其他mingw版本可以先删掉,直到cmd能看到上图所示的提示

 【编译openCV源码】

链接直达:GitHub - huihut/OpenCV-MinGW-Build: 👀 MinGW 32bit and 64bit version of OpenCV compiled on Windows. Including OpenCV 3.3.1, 3.4.1, 3.4.1-x64, 3.4.5, 3.4.6, 3.4.7, 3.4.8-x64, 3.4.9, 4.0.0-alpha-x64, 4.0.0-rc-x64, 4.0.1-x64, 4.1.0, 4.1.0-x64, 4.1.1-x64, 4.5.0-with-contrib, 4.5.2-x64👀 MinGW 32bit and 64bit version of OpenCV compiled on Windows. Including OpenCV 3.3.1, 3.4.1, 3.4.1-x64, 3.4.5, 3.4.6, 3.4.7, 3.4.8-x64, 3.4.9, 4.0.0-alpha-x64, 4.0.0-rc-x64, 4.0.1-x64, 4.1.0, 4.1.0-x64, 4.1.1-x64, 4.5.0-with-contrib, 4.5.2-x64 - GitHub - huihut/OpenCV-MinGW-Build: 👀 MinGW 32bit and 64bit version of OpenCV compiled on Windows. Including OpenCV 3.3.1, 3.4.1, 3.4.1-x64, 3.4.5, 3.4.6, 3.4.7, 3.4.8-x64, 3.4.9, 4.0.0-alpha-x64, 4.0.0-rc-x64, 4.0.1-x64, 4.1.0, 4.1.0-x64, 4.1.1-x64, 4.5.0-with-contrib, 4.5.2-x64https://github.com/huihut/OpenCV-MinGW-Build

为了防止编译器版本不同可能出现的各种奇奇怪怪的问题,就不要下载编译好的x64库了,直接下载源码,然后执行CMAKE,在终端下使用下载好的mingw64 make、install,具体过程参照以下博客:OpenCV使用CMake和MinGW-w64的编译安装_辉哈-CSDN博客_cmake mingw64 笔者在编译的过程中报了如下错误:

[ 32%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/directx.cpp.obj E:\opencv-4.1.0\opencv-4.1.0\modules\core\src\directx.cpp: In function 'void cv::directx::__convertToD3D11Texture2DNV(cv::InputAray, ID3D11Texture2D*)': E:\opencv-4.1.0\opencv-4.1.0\modules\core\src\directx.cpp:1035:5: error: 'D3D11_TEXTURE2D_DESC' was not declared in this scope      D3D11_TEXTURE2D_DESC desc = { 0 }; 解决方法在博客上写的很清楚,在这里不多叙述了,懒得编译的可以下载作者编译好的4.1.0版本

链接:https://pan.baidu.com/s/1s73ZOtg42d0v7LsQwikOpQ  提取码:opas 

【编译Qt源码】

        同样的,Qt库也需要用64位的mingw重新编译一遍,由于官方并没有提供64位编译好的库,所以这波还是自己编译。

编译方法链接:MinGW-w64构建64位Qt - 知乎

Qt源代码下载地址:Index of /new_archive/qt

选择你想要的版本点进去,下载single目录下的这个压缩包,就是Qt源码了

 

 但是此处有一个坑就是这个大哥在配置编译时候删除了jpeg这个选项

 导致的后果是编译好的Qt库中,缺少读取jpg文件的相关组件(原生的Qt只支持png格式的读取,其他格式是作为插件形式拓展在Qt库里的),然后最终导致我的图像处理软件读取png格式的时候完美解决了内存不足的问题,放大到1w像素也没崩掉,但是读取jpg格式时,啪,闪退了。建议把这个删掉改为:cmd /C "configure.bat -shared %BuildType% -platform %QtSPEC% -prefix %QtPrefixDir% -opensource -confirm-license -c++std c++14 -nomake examples -skip wayland -skip purchasing -skip serialbus -skip qtserialport -skip script -skip scxml -skip speech -skip location -no-opengl -qt-zlib -qt-pcre -qt-libpng -qt-freetype -no-openssl",如下图所示,如果不取消这个选项,编译好后是没有qjpeg.dll这个文件的

 【Qt creator搭建64位编译环境】

众所周知,生命在于折腾,终于到了最后一步了

打开Qt creator,点击工具--选项打开Kit设置界面,分别在构建套件、Qt version、编译器、debuggers四栏里手动设置,点击添加

Qt versions选择编译好的64位的qmake.exe路径

添加编译器,C:64位mingw目录下gcc.exe    C++:64位mingw目录下g++.exe,相对路径如图所示(名称可以随便起)

 设置debugger:如图所示

此时的kit:

 回到项目,如果上述步骤没有错误的话,会出现新的构建选项

至此Qt+openCV的64位开发环境已经搭建完成

【应用程序发布】

在之前32位的环境下Qt是提供了发布工具的, 当切换到64位时就不能再使用它来发布应用程序了

如果64位编译好的exe使用了32位的dll组件,会出现无法运行的错误, 这时就只能去编译好的64位库下一个个复制过来了

 

 

 图像处理软件仍在开发中



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3